# 确保为预计开始时间和结束时间赋值的完整数据插入脚本
import sys
import random
from datetime import datetime, timedelta
from tasks.models import Tasks

print("开始生成并插入包含完整时间字段的数据...")

# 定义随机数据生成函数
def generate_task_data(i):
    today = datetime.now().date()
    
    # 确保预计开始时间和结束时间都有值
    # 预计开始时间: 未来1-60天内的随机日期
    plan_start = today + timedelta(days=random.randint(1, 60))
    # 预计结束时间: 预计开始时间后5-30天内的随机日期
    plan_end = plan_start + timedelta(days=random.randint(5, 30))
    
    # 随机生成实际时间（50%概率有值）
    actual_start = None
    actual_end = None
    if random.random() > 0.5:
        # 实际开始时间: 当前日期前0-30天
        actual_start = today - timedelta(days=random.randint(0, 30))
        # 实际结束时间: 实际开始时间后1-20天
        actual_end = actual_start + timedelta(days=random.randint(1, 20))
    
    task_types = ['开发', '设计', '测试', '文档', '部署']
    status = ['未开始', '进行中', '已完成', '已暂停']
    
    return Tasks(
        epic_name=f'史诗{i}',
        story_name=f'故事{i}',
        task_id=f'TASK_NEW{1000+i}',  # 避免ID冲突
        task_name=f'任务{1000+i} - {random.choice(task_types)}任务',
        task_type=random.choice(task_types),
        project='WMS系统',
        fc_publish_version=f'v1.{random.randint(0, 9)}',
        product_manager=f'产品经理{random.randint(1, 5)}',
        status=random.choice(status),
        fc_responsible_person=f'负责人{random.randint(1, 10)}',
        estimate_time=round(random.uniform(1, 16), 1),  # 1-16小时的估计时间
        fc_plan_start_time=plan_start,  # 确保不为空
        fc_plan_end_time=plan_end,      # 确保不为空
        fc_actual_start_time=actual_start,
        fc_actual_end_time=actual_end
    )

try:
    # 生成100条数据
    tasks_to_create = [generate_task_data(i) for i in range(100)]
    
    # 批量插入数据
    Tasks.objects.bulk_create(tasks_to_create, batch_size=50)
    
    print(f"✅ 成功插入100条数据，所有任务都包含预计开始时间和预计结束时间")
    
    # 验证插入结果
    new_tasks = Tasks.objects.filter(task_id__startswith='TASK_NEW').count()
    print(f"\n验证：已找到{new_tasks}条新插入的数据")
    
    # 检查是否有预计时间为空的任务
    null_plan_start = Tasks.objects.filter(task_id__startswith='TASK_NEW', fc_plan_start_time__isnull=True).count()
    null_plan_end = Tasks.objects.filter(task_id__startswith='TASK_NEW', fc_plan_end_time__isnull=True).count()
    
    if null_plan_start == 0 and null_plan_end == 0:
        print("✅ 所有新插入任务的预计开始时间和预计结束时间都已正确赋值！")
    else:
        print(f"❌ 警告：新插入任务中仍有{null_plan_start}条预计开始时间为空，{null_plan_end}条预计结束时间为空")
    
    # 显示示例数据
    sample_task = Tasks.objects.filter(task_id__startswith='TASK_NEW').first()
    if sample_task:
        print(f"\n示例数据详情：")
        print(f"任务ID: {sample_task.task_id}")
        print(f"任务名称: {sample_task.task_name}")
        print(f"预计开始时间: {sample_task.fc_plan_start_time}")
        print(f"预计结束时间: {sample_task.fc_plan_end_time}")
        print(f"实际开始时间: {sample_task.fc_actual_start_time}")
        print(f"实际结束时间: {sample_task.fc_actual_end_time}")
        
except Exception as e:
    print(f"❌ 数据插入失败: {e}")
    sys.exit(1)